#!/bin/bash

# 强力停止所有ChunkServer进程脚本（紧急清理）

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${RED}=== 强力停止所有ChunkServer进程 ===${NC}"
echo -e "${YELLOW}警告: 此脚本将强制停止所有ChunkServer相关进程${NC}"
echo ""

# 获取脚本所在目录
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_DIR="$SCRIPT_DIR/logs"

# 定义端口列表
PORTS=(50051 50052 50053 50054 50055 50056)

# 确认操作
read -p "确定要强制停止所有ChunkServer进程吗? (输入 'YES' 确认): " -r
if [[ ! $REPLY =~ ^YES$ ]]; then
    echo -e "${YELLOW}操作已取消${NC}"
    exit 0
fi

echo ""
echo -e "${BLUE}开始强力清理...${NC}"

# 1. 查找所有可能的chunkserver进程
echo -e "${YELLOW}1. 查找所有ChunkServer进程...${NC}"

# 使用多种方法查找进程
ALL_PIDS=""

# 方法1: pgrep
PIDS1=$(pgrep -f "chunkserver" 2>/dev/null)
if [ ! -z "$PIDS1" ]; then
    ALL_PIDS="$ALL_PIDS $PIDS1"
fi

# 方法2: ps
PIDS2=$(ps aux | grep "chunkserver" | grep -v grep | awk '{print $2}' 2>/dev/null)
if [ ! -z "$PIDS2" ]; then
    ALL_PIDS="$ALL_PIDS $PIDS2"
fi

# 方法3: lsof查找占用端口的进程
for port in "${PORTS[@]}"; do
    PORT_PIDS=$(lsof -ti :$port 2>/dev/null)
    if [ ! -z "$PORT_PIDS" ]; then
        ALL_PIDS="$ALL_PIDS $PORT_PIDS"
    fi
done

# 去重
if [ ! -z "$ALL_PIDS" ]; then
    ALL_PIDS=$(echo $ALL_PIDS | tr ' ' '\n' | sort -u | tr '\n' ' ')
fi

if [ -z "$ALL_PIDS" ]; then
    echo -e "${GREEN}没有找到ChunkServer进程${NC}"
else
    echo -e "${YELLOW}找到以下进程:${NC}"
    for pid in $ALL_PIDS; do
        echo "  - PID: $pid"
        ps -p $pid -o pid,ppid,cmd --no-headers 2>/dev/null | while read line; do
            echo "    详情: $line"
        done
    done
fi

# 2. 强制停止所有进程
echo ""
echo -e "${YELLOW}2. 强制停止所有进程...${NC}"

if [ ! -z "$ALL_PIDS" ]; then
    for pid in $ALL_PIDS; do
        echo -e "${BLUE}强制停止进程 $pid...${NC}"
        kill -9 $pid 2>/dev/null
    done
    
    # 等待一下
    sleep 2
fi

# 3. 使用系统命令清理
echo ""
echo -e "${YELLOW}3. 使用系统命令清理...${NC}"

# pkill
echo -e "${BLUE}使用pkill清理...${NC}"
pkill -9 -f "chunkserver" 2>/dev/null

# killall (如果可用)
if command -v killall &> /dev/null; then
    echo -e "${BLUE}使用killall清理...${NC}"
    killall -9 chunkserver_server 2>/dev/null
    killall -9 chunkserver_client 2>/dev/null
fi

# 4. 清理端口占用
echo ""
echo -e "${YELLOW}4. 清理端口占用...${NC}"
for port in "${PORTS[@]}"; do
    PORT_PIDS=$(lsof -ti :$port 2>/dev/null)
    if [ ! -z "$PORT_PIDS" ]; then
        echo -e "${BLUE}清理端口 $port 的进程: $PORT_PIDS${NC}"
        kill -9 $PORT_PIDS 2>/dev/null
    fi
done

# 5. 清理PID文件
echo ""
echo -e "${YELLOW}5. 清理PID文件...${NC}"
for port in "${PORTS[@]}"; do
    PID_FILE="$LOG_DIR/chunkserver_$port.pid"
    if [ -f "$PID_FILE" ]; then
        rm -f "$PID_FILE"
        echo "  删除: $PID_FILE"
    fi
done

# 6. 最终检查
echo ""
echo -e "${YELLOW}6. 最终检查...${NC}"

# 检查是否还有chunkserver进程
REMAINING_PIDS=$(pgrep -f "chunkserver" 2>/dev/null)
if [ ! -z "$REMAINING_PIDS" ]; then
    echo -e "${RED}警告: 仍有残留进程: $REMAINING_PIDS${NC}"
    echo -e "${YELLOW}这些进程可能需要手动处理${NC}"
else
    echo -e "${GREEN}✓ 所有ChunkServer进程已清理完成${NC}"
fi

# 检查端口占用
echo -e "${BLUE}检查端口占用情况:${NC}"
for port in "${PORTS[@]}"; do
    if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
        echo -e "${RED}  端口 $port 仍被占用${NC}"
    else
        echo -e "${GREEN}  端口 $port 已释放${NC}"
    fi
done

echo ""
echo -e "${GREEN}强力清理完成！${NC}" 